from classical.caesarcipher import caesar_cipeher

class vigenere_cipher(caesar_cipeher):
    # 密钥
    key = ""
    def setVigenereKey(self, key : str):
        '''
        设置密钥
        :param key:密钥
        :return:
        '''
        self.key = key
        self.setCaesarKey(0)

    def vigenere_encrypt(self, plaintext : str):
        '''
        加密
        :param plaintext:明文
        :return: 密文
        '''
        return self.vigenere_crypt(plaintext, True)

    def vigenere_decrypt(self, cipertext : str):
        '''
        解密
        :param cipertext:密文
        :return: 明文
        '''
        return self.vigenere_crypt(cipertext, False)

    def vigenere_crypt(self, text : str, isEn):
        '''
        维吉尼亚加密算法， 可以看作是每个字母都单独进行一次凯撒加密
        :param text: 数据
        :param isEn: 是否加密
        :return: 数据
        '''
        result = ""
        #遍历key的索引
        key_index = 0
        for x in text:
            # 判断是否字母，不是则不进行加密
            if x.isalpha():
                # 计算本次的key的所在偏移
                n = ord(self.key[key_index % len(self.key)].upper()) - ord('A')
                key_index += 1
                # 更新偏移
                self.setCaesarKey(n)
                # 进行本次的凯撒加密/解密，通过isEn来判断是加密还是解密
                result += self.caesar_encrypt(x) if isEn else self.caesar_decrypt(x)
            else:
                result += x
        return result